package com.time.admin.application.controller;

import com.google.common.base.Preconditions;
import com.time.admin.application.converter.PostCategoryDTOConverter;
import com.time.admin.application.dto.CategoryDTO;
import com.time.admin.application.dto.PostCategoryDTO;
import com.time.admin.domain.entity.CategoryBO;
import com.time.admin.domain.entity.PostCategoryBO;
import com.time.admin.domain.service.AdminPostCategoryDomainService;
import com.time.auth.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 文章分类关联管理控制层
 *
 * @author: HuangQi
 * @date: Created in 11:28 2025/10/15
 * @description: 文章分类关联管理控制层类
 */
@Slf4j
@RestController
@RequestMapping("/admin/postCategory")
public class PostCategoryController {

    @Autowired
    private AdminPostCategoryDomainService adminPostCategoryDomainService;

    /**
     * 新增文章分类关联关系
     *
     * @param postCategoryDTO 文章分类关联信息
     * @return 新增结果
     */
    @PostMapping("add")
    public Result<Boolean> add(@RequestBody PostCategoryDTO postCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostCategoryController.add.dto:{}", postCategoryDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postCategoryDTO.getCategoryId(), "文章分类关联的分类id不能为空");
            Preconditions.checkNotNull(postCategoryDTO.getPostId(), "文章分类关联的文章id不能为空");

            // 调用领域层
            PostCategoryBO postCategoryBO = PostCategoryDTOConverter.INSTANCE.convertDTOToBO(postCategoryDTO);
            Boolean addResult = adminPostCategoryDomainService.add(postCategoryBO);

            // 返回结果
            return Result.ok(addResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostCategoryController.add.error:{}", e.getMessage(), e);
            return Result.fail("管理模块新增文章分类关联失败");
        }
    }

    /**
     * 更新文章分类关联关系
     *
     * @param postCategoryDTO 文章分类关联的信息
     * @return 更新结果
     */
    @PostMapping("update")
    public Result<Boolean> update(@RequestBody PostCategoryDTO postCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostCategoryController.update.dto:{}", postCategoryDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postCategoryDTO.getId(), "文章分类关联的id不能为空");
            Preconditions.checkNotNull(postCategoryDTO.getCategoryId(), "文章分类关联的分类id不能为空");
            Preconditions.checkNotNull(postCategoryDTO.getPostId(), "文章分类关联的文章id不能为空");

            // 调用领域层
            PostCategoryBO postCategoryBO = PostCategoryDTOConverter.INSTANCE.convertDTOToBO(postCategoryDTO);
            Boolean updateResult = adminPostCategoryDomainService.update(postCategoryBO);

            // 返回结果
            return Result.ok(updateResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostCategoryController.update.error:{}", e.getMessage(), e);
            return Result.fail("管理模块更新文章分类关联失败");
        }
    }

    /**
     * 删除文章分类关联
     *
     * @param postCategoryDTO 删除文章分类关联的信息
     * @return 删除结果
     */
    @PostMapping("delete")
    public Result<Boolean> delete(@RequestBody PostCategoryDTO postCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostCategoryController.delete.dto:{}", postCategoryDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postCategoryDTO.getCategoryId(), "文章分类关联的分类id不能为空");
            Preconditions.checkNotNull(postCategoryDTO.getPostId(), "文章分类关联的文章id不能为空");

            // 调用领域层
            PostCategoryBO postCategoryBO = PostCategoryDTOConverter.INSTANCE.convertDTOToBO(postCategoryDTO);
            Boolean deleteResult = adminPostCategoryDomainService.delete(postCategoryBO);

            // 返回结果
            return Result.ok(deleteResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostCategoryController.delete.error:{}", e.getMessage(), e);
            return Result.fail("管理模块删除文章分类关联失败");
        }
    }

    /**
     * 查询文章查询关联的分类
     *
     * @param postCategoryDTO 删除文章分类关联的信息
     * @return 文章关联分类信息
     */
    @PostMapping("queryCategory")
    public Result<CategoryDTO> queryCategory(@RequestBody PostCategoryDTO postCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.PostCategoryController.queryCategory.dto:{}", postCategoryDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(postCategoryDTO.getPostId(), "文章分类关联的文章id不能为空");

            // 调用领域层
            PostCategoryBO postCategoryBO = PostCategoryDTOConverter.INSTANCE.convertDTOToBO(postCategoryDTO);
            CategoryBO categoryBO = adminPostCategoryDomainService.queryCategory(postCategoryBO);
            CategoryDTO categoryDTO = PostCategoryDTOConverter.INSTANCE.convertBOToCategoryDTO(categoryBO);

            // 返回结果
            return Result.ok(categoryDTO);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.PostCategoryController.queryCategory.error:{}", e.getMessage(), e);
            return Result.fail("管理模块查询文章查询关联的分类失败");
        }
    }
}
